package br.unifor.ads.desphouse.business;

import java.sql.SQLException;
import java.util.List;

import br.unifor.ads.desphouse.dao.LancamentoDAO;
import br.unifor.ads.desphouse.dao.LancamentoTipoDAO;
import br.unifor.ads.desphouse.entity.Lancamento;
import br.unifor.ads.desphouse.entity.LancamentoTipo;
import br.unifor.ads.desphouse.exception.BusinessException;
import br.unifor.ads.desphouse.to.LancamentoTipoTO;
import br.unifor.ads.desphouse.util.LinguaUtil;

/**
 * Classe de negocio para o LancamentoTipo.
 * 
 * @author Alex Girao
 */
public class LancamentoTipoBusiness {
	
	private LancamentoTipoDAO lancamentoTipoDAO;
	private LancamentoDAO lancamentoDAO;
	
	public LancamentoTipoBusiness() {
		lancamentoTipoDAO = new LancamentoTipoDAO();
		lancamentoDAO = new LancamentoDAO();
	}
	
	/**
	 * Persistem um LancamentoTipo no banco,
	 * pode ser um cadastro ou uma atualizacao
	 * 
	 * @param tipo
	 * @return
	 * @throws BusinessException
	 */
	public LancamentoTipo salvar(LancamentoTipo tipo) throws BusinessException{
		try {
			if(tipo.getCodigo()==null){
				tipo = lancamentoTipoDAO.salvar(tipo);
			}else{
				lancamentoTipoDAO.atualizar(tipo);
			}
			return tipo;
		} catch (SQLException e) {
			e.printStackTrace();
			throw new BusinessException(e.getMessage());
		}
	}
	
	/**
	 * Retorna todos os LancamentoTipo's 
	 * cadastros o banco
	 * 
	 * @return
	 * @throws BusinessException
	 */
	public List<LancamentoTipo> buscarTodos() throws BusinessException{
		try {
			return lancamentoTipoDAO.buscarTodos();
		} catch (SQLException e) {
			e.printStackTrace();
			throw new BusinessException(e.getMessage());
		}
	}
	
	/**
	 * Retorna um LancamentoTipo pelo codigo
	 * 
	 * @param codigo
	 * @return
	 * @throws BusinessException
	 */
	public LancamentoTipo buscarPorCodigo(Long codigo) throws BusinessException{
		try {
			return lancamentoTipoDAO.buscarPorCodigo(codigo);
		} catch (SQLException e) {
			e.printStackTrace();
			throw new BusinessException(e.getMessage());
		}
	}
	
	/**
	 * Retorna um LancamentoTipo pela sua descricao
	 * 
	 * @param descricao
	 * @return
	 * @throws BusinessException
	 */
	public LancamentoTipo buscarPorDescricao(String descricao) throws BusinessException{
		try {
			return lancamentoTipoDAO.buscarPorDescricao(descricao);
		} catch (SQLException e) {
			e.printStackTrace();
			throw new BusinessException(e.getMessage());
		}
	}
	
	/**
	 * Exclui um LancamentoTipo pelo codigo
	 * @param codigo
	 * @throws BusinessException
	 */
	public void excluirPorCodigo(Long codigo) throws BusinessException{
		try {
			lancamentoTipoDAO.excluirPorCodigo(codigo);
		} catch (SQLException e) {
			e.printStackTrace();
			throw new BusinessException(e.getMessage());
		}
	}
	
	/**
	 * Verifica se existe algum lancamento
	 * cadastrado com o tipo informado
	 * 
	 * @param codigo
	 * @return
	 * @throws BusinessException
	 */
	public boolean verificarDependencia(Long codigo) throws BusinessException{
		try {
			List<Lancamento> list = lancamentoDAO.buscarPorTipoLancamento(codigo);
			return list!=null && !list.isEmpty();
		} catch (SQLException e) {
			e.printStackTrace();
			throw new BusinessException(LinguaUtil.getTexto("excecao.comun.falhaExclusao.existeDependencia"));
		}
	}

	//TODO criar teste
	public List<LancamentoTipo> buscarPorFiltro(LancamentoTipoTO to) throws BusinessException {
		try {
			return lancamentoTipoDAO.buscarPorFiltro(to);
		} catch (SQLException e) {
			e.printStackTrace();
			throw new BusinessException(e.getMessage());
		}
	}

}
